// let var const的区别
/**
 * 
 * ES5 var
 * 
 * 1.变量可以提升；
 * 2.会成为window的属性；
 * 3.可以重复定义变量；
 * 4.有局部作用域和全局作用域；
 * 5.定义变量后可以修改
 * 
 * ES6 let
 * 
 * 1.没有变量提升
 * 2.不会成为window的属性
 * 3.在同一个作用域不可以重复定义变量；（会报错，告诉你这个变量已经有了）
 * 4.只有块级作用域（就是指{}）eg:if();for(){};while{}
 * 5.暂时性死区：在局部（定义的变量）会暂时封锁在这个区域内，其他和他名字相同的变量都不可用；
 * 6.定义变量后可以修改
 * 
 * ES6 const
 * 
 * 1.定义的是常量；
 * 2.以后不能再修改；
 * 3.必须要有初始值；
 * 4.没有变量提升；
 * 5.在同一个作用域不可以重复定义变量；
 * 6.定义变量后不可以修改(但是变量为应用类型的变量可以修改）；
 * 7.不会成为window的属性
 */


// var a = 10;
// console.log(a)//输出10

// console.log(a) //undefined
// var a = 10

// let a = 12;
// console.log(a)//12

// console.log(a);//报错， a is not defined
// let a = 12

// var a = 10;
// console.log(window.a); //10

// let a = 12;
// console.log(window.a) //udefined;

// var a = 123;
// var a = 456;
// console.log(a)//456

// let a = 123;
// let a = 456;
// console.log(a) //报错，变量a已经有了； Identifier 'a' has already been declared

// {
//     let a = 12;
//     console.log(a)
// }
// console.log(a) // a is not defined

// if (true) {
//     let a = 123
// }
// console.log(a)//报错， a is not defined

// var arr = [];
// for (var i = 0; i < 4; i++) {
//     arr[i] = function() {
//         console.log(i)
//     }
// }
// arr[2](); //4
// arr[3](); //4

// let arr = [];
// for (let i = 0; i < 4; i++) {
//     arr[i] = function() {
//         console.log(i)
//     }
// }
// arr[2](); //2
// arr[3](); //3

// let i = 10;
// for (let i = 0; i < 3; i++) {
//     let i = 155;
//     console.log(i)
// }
// console.log(i)//155 155 155 10

// let i = 10;
// for (let i = 0; i < 3; i++) {
//     console.log(i)
//     let i = 155;
// }
// console.log(i) // i is not defined

// let i = 10;
// for (let i = 0; i < 3; i++) {
//     console.log(i)
// }
// console.log(i) // 0,1,2,10

// let i = 10;
// function fun() {
//     console.log(i)
// }
// fun()//10

// let i = 10;
// function fun() {
//     console.log(i)
//     let i = 5
// }
// fun()//报错i is not defined

// let i = 10;
// function fun() {
//     let i = 5
//     console.log(i)
// }
// fun() //5

// 暂时性死区：在局部（定义的变量）会暂时封锁在这个区域内，其他和他名字相同的变量都不可用；

// const num = 10;
// num = 20;
// console.log(num)//报错，num 是常量，不可以修改；Assignment to constant variable.

// const num;
// num = 10//栈内存
// console.log(num) //没有给num赋初始值； Missing initializer in const declaration

// const obj = {//堆内存
//     name: "lili"
// };
// obj.age = '12';
// console.log(obj)//{ name: 'lili', age: '12' }

// const arr = [1, 2, 3, 4];
// arr.push(5);
// console.log(arr)//[ 1, 2, 3, 4, 5 ] 还是原来的arr

// const arr = [1, 2, 5, 3];
// arr = [4];
// console.log(arr) //报错，不可以重新赋值；

// const a = 2;
// console.log(window.a)//undefined